home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / OBJMXUD.C < prev    next >
C/C++ Source or Header  |  1992-12-06  |  2KB  |  50 lines

  1. /**************************************************************************
  2.  * OBJMXUD.C - Turn a normal object into an XUSERDEF object.
  3.  *
  4.  *  Whenever a library routine wants to supply a custom drawing routine
  5.  *  for a standard GEM object, it calls this to fill in an XUSERDEF
  6.  *  and attach it to the original object.  The difference between an
  7.  *  XUSERDEF object and a regular USERDEF object is the contents of the
  8.  *  USERBLK structure attached to the object.  A regular USERBLK contains
  9.  *  a pointer to the drawing routine followed by a longword of anything
  10.  *  the application wants.  For an XUSERBLK, the ap-specific longword is
  11.  *  a pointer to the XUSERBLK itself, and then there are three more fields,
  12.  *  which contain the original ob_type and the original ob_spec, and a
  13.  *  longword of anything the XUSERBLK creator wants.
  14.  *
  15.  *  All this smoke-and-mirrors lets us transform a standard GEM object
  16.  *  into a new custom type without losing the information from the
  17.  *  original object.  Other library routines (rsc_gstrings, for example)
  18.  *  know how to cope with XUSERBLK objects.
  19.  *
  20.  *  Note that we properly cope with INDIRECT objects (as always), and
  21.  *  we preserve any extended type info in the original object; we only
  22.  *  change the low-order byte when plugging in the G_USERDEF ob_type.
  23.  *************************************************************************/
  24.  
  25. #include "gemfast.h"
  26.  
  27. void obj_mxuserdef(pblk, pobj, pcode)
  28.     XUSERBLK    *pblk;
  29.     OBJECT      *pobj;
  30.     void        *pcode;
  31. {
  32.     long        *pspec;
  33.  
  34.     pspec = &pobj->ob_spec;
  35.     if (pobj->ob_flags & INDIRECT) {
  36.         pspec = (long *)*pspec;
  37.     }
  38.  
  39.     pblk->ub_code  = pcode;
  40.     pblk->ub_self  = pblk;
  41.     pblk->ub_size  = sizeof(XUSERBLK);
  42.     pblk->reserved = (void *)0;
  43.  
  44.     pblk->ob_type  = pobj->ob_type & 0x00FF;
  45.     pobj->ob_type  = G_USERDEF | (pobj->ob_type & 0xFF00);
  46.  
  47.     pblk->ob_spec  = *pspec;
  48.     *pspec         = (long)pblk;
  49. }
  50.